/*****************************************************************************
*                     Organizacion de Datos - 75.06                          *
*                         Catedra Lic. Servetto                              *
*            Facultad de Ingenieria - Universidad de Buenos Aires            *
******************************************************************************/

#include "ParseadorComandos.h"
#include "AdministradorDeOperaciones.h"
#include "AdministradorMetadata.h"

#include <list>
#include <string>
#include <fstream>

namespace CapaConsulta 
{

	Operacion* ParseadorComandos::ParsearCreacion(list<string>* operacion) {
		
		if (operacion->size() != 3)
		{
			cerr << "La creacion de una clase espera un comando de la forma CREATE CLASS '' (3 cadenas), se encontro una cantidad de cadenas distinta de las esperada (" << operacion->size() << " cadena(s))." << endl;
			throw new exception();
		}

		string createSupuesto = operacion->front();
		operacion->pop_front();
		string classSupuesto = operacion->front();
		operacion->pop_front();
		string pathSupuesto = operacion->front();
		
		if (createSupuesto != "CREATE")
		{
			cerr << "La creacion de una clase espera el comando CREATE, se encontro " << createSupuesto << "." << endl;
			throw new exception();
		}
		
		if (classSupuesto != "CLASS")
		{
			cerr << "La creacion de una clase espera el comando CLASS despues de CREATE, se encontro " << classSupuesto << "." << endl;
			throw new exception();
		}
		
		if (!ParseadorComandos::ValidarDatosEntreComillasSimples(pathSupuesto))
		{
			cerr << "La creacion de una clase espera un dato entre '' despues de CREATE CLASS, se encontro " << pathSupuesto << "." << endl;
			throw new exception();
		}
		
		string path = ParseadorComandos::EliminarComillasSimplesDeDatos(pathSupuesto);
		
		ifstream archivoParaValidacion(path.c_str(), ios_base::in);
		if (archivoParaValidacion.bad())
		{
			cerr << "No se puede leer el archivo de creacion de clases '" << path << "'." << endl;
			throw new exception();
		}
		archivoParaValidacion.close();
		
		CrearClase* operacionCrearClase = new CrearClase();
		
		operacionCrearClase->PathArchivoCreacion = new string(path);
		
		return operacionCrearClase;
	};
	
}
